home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -in_the_mag- / banging_the_metal / draw_logic / draw_logic.text < prev    next >
Text File  |  1999-09-10  |  6KB  |  152 lines

  1. BRUTE-FORCE VECTOR GRAPHICS in BASIC and ASSEMBLY code
  2.  
  3.  
  4.  
  5. This is an extract from the DIY Toolkit (Qdos cardware) package. It is of interest because it 
  6. includes BASIC and 68K assembler code to draw lines, a job which the Amiga can do in 
  7. hardware. The complete DIY Toolkit package is available from Qdos pages like this one:
  8.  
  9.  
  10.  
  11. http://www.users.imaginet.fr/~godefroy/english/QDOS.html
  12.  
  13.  
  14.  
  15. The DRAW routines come in two forms. The file DRAW_ASM is the assembly code, tested 
  16. using HiSoft's DevPac and Metacomco's assembler. You may edit and re-assemble this with 
  17. your own assembler. DRAW_DEMO_BAS is a cut-down version in BASIC, limited to certain 
  18. angles (see the discussion of Quadrants in the magazine) but thus even more similar to the 
  19. Amiga hardware implementation.
  20.  
  21.  
  22.  
  23. The Algorithm
  24.  
  25.  
  26.  
  27. The algorithm to generate a straight line is simple in principle, but complicated by the need to 
  28. draw lines in any direction at any angle. The machine code is convoluted and uses all sixteen 
  29. 68008 registers, so I wrote the algorithm in SuperBASIC for test purposes, after I wrote PLOT 
  30. and before I machine-coded DRAW.
  31.  
  32.  
  33.  
  34. ×DRAW_DEMO_BAS shows the algorithm in block-structured BASIC. The first stage is to find 
  35. the direction and magnitude of the line, in the X and Y dimensions. DX indicates whether the 
  36. line moves left (-1), right (+1) or neither left or right (0). DY is the same for vertical movement - 
  37. in other words, DX and DY indicate the approximate direction of the line, relative to the 
  38. horizontal and vertical.
  39.  
  40.  
  41.  
  42. MX and MY indicate the number of pixels to be moved vertically or horizontally. The values 
  43. are always positive, or zero, thanks to the ABS function. Assuming pixels are square, you can 
  44. draw a straight line at any angle between 0 and 45 degrees by stepping through a series of 
  45. points equal to the greater of MX and MY.
  46.  
  47.  
  48.  
  49. At each step you advance X or Y (whichever is greater) by one. Whether you advance the 
  50. other co-ordinate depends on the slope of the line. Since we want a straight line, the need for 
  51. an alternate step  depends on how long it was since you last took one.
  52.  
  53.  
  54.  
  55. If MX equals MY the angle is 45 degrees and you step one pixel horizontally and vertically at 
  56. each stage. If either DX or DY is zero, the angle is zero and you just step either horizontally or 
  57. vertically until you get to the end. Most lines fall between these two angles. Sometimes you 
  58. can make the step in DX and DY, but sometimes you must just step in the main direction, 
  59. indicated by the greater of MX and MY.
  60.  
  61.  
  62.  
  63. The program creates two step values for each dimension; DX and DY, plus DDX and DDY for 
  64. the alternative steps needed to cope with intermediate angles. DDX and DDY hold the 'main' 
  65. direction. If MX exceeds MY, DDX is the same as DX, and DDY is zero. If MY is greater than 
  66. MX, DDY matches DY and DDX is zero.
  67.  
  68.  
  69.  
  70. The problem is deciding when to step by (DX,DY), and when to use (DDX,DDY). The correct 
  71. mix is determined by the ratio of MX and MY. If MX is relatively small, you must take many 
  72. vertical steps for every horizontal one.
  73.  
  74.  
  75.  
  76. Since we want a continuous line, the total number of STEPS, and points to plotted, is given by 
  77. the greater of X and Y. The number of jumps out of line, or non-contiguous PARTS, is clearly 
  78. the lesser of X and Y.
  79.  
  80.  
  81.  
  82. For each step the algorithm adds the number of PARTS to a temporary variable. If the result 
  83. exceeds the total in STEPS, the algorithm uses DX and DY to find the next point; otherwise it 
  84. uses DDX and DDY. At the start, TEMP is set to half of the number of steps, so jumps out of 
  85. line are evenly spaced.
  86.  
  87.  
  88.  
  89. Any algorithm that works for angles between 0 and 45 degrees can be persuaded to cover a 
  90. full circle by swapping X and Y and allowing positive and negative steps. This is the role of the 
  91. SIGN function-calls and the first IF test. The Amiga Blitter must be programmed with three bits 
  92. to indicate the quadrant.
  93.  
  94.  
  95.  
  96. The Assembly code
  97.  
  98.  
  99.  
  100. PLOT sets a single dot in any window on the QL screen. It takes two or three integer 
  101. parameters - an optional channel number, followed by the X and Y co-ordinates of the dot you 
  102. want to set.
  103.  
  104.  
  105.  
  106. DRAW takes the same parameters - an optional channel, then the X and Y co-ordinates of the 
  107. end of a line. It draws a straight line joining the last position used with PLOT to the dot at the 
  108. co-ordinate supplied with DRAW. For instance this command draws a red and green striped 
  109. line from the top left corner of the screen to the bottom right:
  110.  
  111.  
  112.  
  113.     WINDOW 512,256,0,0 : INK 4,2 : PLOT 0,0 : DRAW 511,255
  114.  
  115.  
  116.  
  117. PLOT and DRAW work in any CONsole or SCReen window; they use the current INK colour 
  118. and recognise OVER -1 as well as OVER 0 or 1. OVER -1 combines the line colour and the 
  119. background in such a way that re-drawing a line in the same colour restores the original 
  120. background.
  121.  
  122.  
  123.  
  124. PLOT and DRAW use the 'pixel co-ordinate' scheme, explained in the 'Concepts' section of 
  125. the QL User Guide. Co-ordinates are relative to the top left corner of the specified window, as 
  126. for BLOCK and PIXEL%.
  127.  
  128.  
  129.  
  130. PLOT and DRAW check their parameters to ensure that they fit in  the specified or default 
  131. window. The default channel number is #1 so you can re-direct both commands to other 
  132. channels with USE, the March 1988 DIY Toolkit offering.\par 
  133.  
  134.  
  135.  
  136. The commands report 'channel not open' if the channel is closed. You get a 'bad parameter' 
  137. error if you specify the wrong type of channel or the wrong number of parameters. 'Error in 
  138. expression' indicates that one or more parameters could not be evaluated as integers.\par 
  139.  
  140.  
  141.  
  142. PLOT and DRAW return 'not complete' if called when CTRL-F5 has been pressed, to pause 
  143. the display. You don't see this message under normal circumstances, as the operating system 
  144. traps it, temporarily suspends the calling task, and re-tries until a key is pressed, re-enabling 
  145. display output.
  146.  
  147.  
  148.  
  149. For more details and much more interesting code and commentary, see Volume G of DIY 
  150. Toolkit, and please send me an email (simon@studio.co.uk) or a postcard if you use it!
  151.  
  152.